package xgodbkv

import (
	"time"
)

// KV换取ID信息
//
//	value	待查询的信息
func GetId(value string) uint {
	if _default.DB == nil {
		return 0
	}
	if len(value) > 200 {
		value = value[0:200]
	}
	// cache中读取
	for i, v := range _default.Cache {
		if v == value {
			return i
		}
	}
	// 数据库中读取
	kv := KeyValue{}
	err := _default.DB.Table(_default.KVTable).Where("value", value).Limit(1).Find(&kv).Error
	if err != nil {
		return 0
	}
	if kv.Id == 0 {
		// 不存在该记录，执行插入操作
		kv.Value = value
		kv.CreatedAt = time.Now().Format(time.DateTime)
		err := _default.DB.Table(_default.KVTable).Save(&kv).Error
		if err != nil {
			return 0
		}
	}
	_default.Lock.Lock()
	_default.Cache[kv.Id] = kv.Value
	_default.Lock.Unlock()
	// 延时2小时后删除该ID，以免内存过多导致的map无限大
	time.AfterFunc(time.Hour*2, func() {
		_default.Lock.Lock()
		delete(_default.Cache, kv.Id)
		_default.Lock.Unlock()
	})
	return kv.Id
}

// KV换取VALUE信息
//
//	id	待查询的ID值
func GetValue(id uint) string {
	if id == 0 {
		return ""
	}
	// 从缓存中读取
	if v, ok := _default.Cache[id]; ok {
		return v
	}
	// 从数据库中读取
	// 数据库中读取
	kv := KeyValue{}
	err := _default.DB.Table(_default.KVTable).Where("id", id).Limit(1).Find(&kv).Error
	if err != nil {
		return ""
	}
	if kv.Id == 0 {
		return ""
	}
	_default.Lock.Lock()
	_default.Cache[kv.Id] = kv.Value
	_default.Lock.Unlock()
	// 延时2小时后删除该ID，以免内存过多导致的map无限大
	time.AfterFunc(time.Hour*2, func() {
		_default.Lock.Lock()
		delete(_default.Cache, kv.Id)
		_default.Lock.Unlock()
	})
	return kv.Value
}
